package com.ltkj.system.service.impl;

import com.ltkj.common.core.constant.UserConstants;
import com.ltkj.common.core.exception.ServiceException;
import com.ltkj.common.core.utils.DateUtils;
import com.ltkj.common.core.utils.StringUtils;
import com.ltkj.common.datascope.annotation.DataScope;
import com.ltkj.common.security.utils.SecurityUtils;
import com.ltkj.system.api.domain.SysStores;
import com.ltkj.system.api.domain.SysUser;
import com.ltkj.system.domain.SysUserStores;
import com.ltkj.system.domain.vo.SysUserStoresVo;
import com.ltkj.system.mapper.SysStoresBizMapper;
import com.ltkj.system.mapper.SysStoresMapper;
import com.ltkj.system.mapper.SysUserStoresMapper;
import com.ltkj.system.service.ISysStoresService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 基础店铺信息Service业务层处理
 * 
 * @author xupf
 * @date 2023-09-09
 */
@Service
public class SysStoresServiceImpl implements ISysStoresService 
{
    @Autowired
    private SysStoresMapper sysStoresMapper;
    @Autowired
    private SysStoresBizMapper sysStoresBizMapper;
    @Autowired
    private SysUserStoresMapper sysUserStoresMapper;

    /**
     * 查询基础店铺信息
     * 
     * @param id 基础店铺信息主键
     * @return 基础店铺信息
     */
    @Override
    public SysStores selectSysStoresById(Long id)
    {
        return sysStoresMapper.selectSysStoresById(id);
    }

    /**
     * 根据数据权限查询基础店铺信息列表
     * 
     * @param sysStores 基础店铺信息
     * @return 基础店铺信息
     */
    @Override
    @DataScope(storeAlias = "us")
    public List<SysStores> selectListByDataScope(SysStores sysStores)
    {
        // 逻辑删除标识，必传
        sysStores.setIsDel("0");
        return sysStoresBizMapper.selectList(sysStores);
    }
    /**
     * 查询基础店铺信息列表
     *
     * @param sysStores 基础店铺信息
     * @return 基础店铺信息
     */
    @Override
    public List<SysStores> selectSysStoresList(SysStores sysStores)
    {
        // 逻辑删除标识，必传
        sysStores.setIsDel("0");
        return sysStoresMapper.selectSysStoresList(sysStores);
    }

    /**
     * 根据条件分页查询已分配用户角色列表
     *
     * @param user 用户信息
     * @return 用户信息集合信息
     */
    @Override
    public List<SysUser> selectAllocatedList(SysUserStoresVo user) {
        return sysUserStoresMapper.selectAllocatedList(user);
    }

    /**
     * 根据条件分页查询未分配用户角色列表
     *
     * @param user 用户信息
     * @return 用户信息集合信息
     */
    @Override
    public List<SysUser> selectUnallocatedList(SysUserStoresVo user) {
        return sysUserStoresMapper.selectUnallocatedList(user);
    }

    /**
     * 通过店铺ID查询店铺分配用户数量
     *
     * @param storesId 店铺ID
     * @return 结果
     */
    @Override
    public int countUserStoresByStoresId(Long storesId)
    {
        return sysUserStoresMapper.countUserStoresByStoresId(storesId);
    }

    /**
     * 新增基础店铺信息
     * 
     * @param sysStores 基础店铺信息
     * @return 结果
     */
    @Override
    public int insertSysStores(SysStores sysStores)
    {
        sysStores.setCreateTime(DateUtils.getNowDate());
        sysStores.setCreateBy(SecurityUtils.getLoginUser().getUsername());
        sysStores.setIsDel("0");
        // 生成编码
        sysStores.setCode("");
        return sysStoresMapper.insertSysStores(sysStores);
    }

    /**
     * 修改基础店铺信息
     * 
     * @param sysStores 基础店铺信息
     * @return 结果
     */
    @Override
    public int updateSysStores(SysStores sysStores)
    {
        sysStores.setUpdateTime(DateUtils.getNowDate());
        sysStores.setUpdateBy(SecurityUtils.getLoginUser().getUsername());
        return sysStoresMapper.updateSysStores(sysStores);
    }

    /**
     * 批量删除基础店铺信息
     * 
     * @param ids 需要删除的基础店铺信息主键
     * @return 结果
     */
    @Override
    public int deleteSysStoresByIds(Long[] ids)
    {
        for (Long id : ids) {
            SysStores sysStores = selectSysStoresById(id);
            if (countUserStoresByStoresId(id) > 0)
            {
                throw new ServiceException(String.format("[%1$s]已分配用户,不能删除", sysStores.getName()));
            }
        }
        return sysStoresBizMapper.deleteSysStoresByIds(ids);
    }

    /**
     * 删除基础店铺信息信息
     * 
     * @param id 基础店铺信息主键
     * @return 结果
     */
    @Override
    public int deleteSysStoresById(Long id)
    {
        SysStores sysStores = selectSysStoresById(id);
        if (countUserStoresByStoresId(id) > 0)
        {
            throw new ServiceException(String.format("[%1$s]已分配用户,不能删除", sysStores.getName()));
        }
        return sysStoresBizMapper.deleteSysStoresById(id);
    }

    /**
     * 取消授权用户店铺
     *
     * @param userStores 用户和角色关联信息
     * @return 结果
     */
    @Override
    public int deleteAuthUser(SysUserStores userStores)
    {
        return sysUserStoresMapper.deleteUserStoresInfo(userStores);
    }

    /**
     * 批量取消授权用户店铺
     *
     * @param storesId 店铺ID
     * @param userIds 需要取消授权的用户数据ID
     * @return 结果
     */
    @Override
    public int deleteAuthUsers(Long storesId, Long[] userIds)
    {
        return sysUserStoresMapper.deleteUserStoresInfos(storesId, userIds);
    }

    /**
     * 批量选择授权用户店铺
     *
     * @param storesId 角色ID
     * @param userIds 需要授权的用户数据ID
     * @return 结果
     */
    @Override
    public int insertAuthUsers(Long storesId, Long[] userIds)
    {
        // 新增用户与店铺管理
        List<SysUserStores> list = new ArrayList<SysUserStores>();
        for (Long userId : userIds)
        {
            SysUserStores ur = new SysUserStores();
            ur.setUserId(userId);
            ur.setSysStoresId(storesId);
            list.add(ur);
        }
        return sysUserStoresMapper.batchUserStores(list);
    }

    /**
     * 校验店铺名称是否唯一
     *  后期可改为校验 统一社会信用代码 是否唯一
     *
     * @param sysStores 店铺信息
     * @return 结果
     */
    @Override
    public boolean checkStoresNameUnique(SysStores sysStores)
    {
        Long storesId = StringUtils.isNull(sysStores.getId()) ? -1L : sysStores.getId();
        SysStores info = sysStoresBizMapper.checkStoresNameUnique(sysStores.getName());
        if (StringUtils.isNotNull(info) && info.getId().longValue() != storesId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

}
